iOS開發筆記 基於wsdl2objc調用asp.net WebService

1.準備

先下載待會要用到的工具 WSDL2ObjC-0.6.zip WSDL2ObjC-0.7-pre1.ziphtml

 

我用的是WSDL2ObjC-0.6.zipweb

1.1搭建asp.net WebService項目而且部署在IIS服務器上面

建立WebService服務項目後先在Web.config添加節點,設置WebService遠程調試訪問,不然會出現:sql

「測試窗體只能用於來自本地計算機的請求」數據庫

 

 

<webServices>
<protocols>
<add name="HttpSoap" />
<add name="HttpPost" />
<add name="HttpGet" />
<add name="Documentation" />
</protocols>
</webServices>
View Code

建立類庫添加Model實體類json

 

public class CourseEntity
{

    private int courseID;

    public int CourseID
    {
        get { return courseID; }
        set { courseID = value; }
    }
    private int parentID;

    public int ParentID
    {
        get { return parentID; }
        set { parentID = value; }
    }
    private string courseName;

    public string CourseName
    {
        get { return courseName; }
        set { courseName = value; }
    }
    private string coursePPT;

    public string CoursePPT
    {
        get { return coursePPT; }
        set { coursePPT = value; }
    }
    private string courseVidio;

    public string CourseVidio
    {
        get { return courseVidio; }
        set { courseVidio = value; }
    }
    
}
View Code

 

事先作好Model實體類的生成dll文件,直接添加引用至bin目錄下windows

在項目當中添加一個數據庫操做類DBOperation.cs服務器

接下來咱們打開Service.cs文件。asp.net

2.asp.net WebService返回Xml Json格式數據

2.1返回Xml格式數據

service.cs代碼以下:ide

  [WebMethod(Description = "ProblemPaper")]
    public List<ProblemPaperEntity> ProblemPaper(String prkid)
    {
        return dbOperation.ProblemPaper(prkid);
    }
View Code

DBOperation.cs代碼以下:工具

/// <summary>
    /// 題庫試卷目錄表 ProblemPaper
    /// </summary>
    /// <returns>PPID(編號)PRKID(上一級)PTID(類型編號)Name(名稱)ProblemNum(目錄數量))</returns>
    public List<ProblemPaperEntity> ProblemPaper(String prkid)
    {


        List<ProblemPaperEntity> list = new List<ProblemPaperEntity>();

        ProblemPaperEntity model = null;



        try
        {
            string sql = "select PPID,PRKID,PTID,Name,ProblemNum,Row_Number() over(order by PPID ) as row_number from ProblemPaper where 1=1";
            sql += "  and prkid in ( select * from getProblemResourseByID("+prkid+"))";
            string s = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection con = new SqlConnection(s);
            con.Open();
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader reader = cmd.ExecuteReader();


            while (reader.Read())
            {
                model = new ProblemPaperEntity();

                model.PPID = reader.GetInt32(0);
                model.PRKID = reader.GetInt32(1);
                model.PTID = reader.GetInt32(2);
                model.Name = reader.GetString(3);
                model.ProblemNum = reader.GetInt32(4);
              
                list.Add(model);
            }



            reader.Close();
            cmd.Dispose();

        }
        catch (Exception)
        {

        }


        return list;

    }
View Code

 

從service.cs代碼中能夠看到ProblemPaper方法前面 [WebMethod]指示web服務提供的方法

public方法可否被調用者訪問取決於這個方法是不是一個「WebMethod」,在編寫方法的時候注意

方法前面是否含有WebMethod

2.2返回Json格式數據

service.cs 代碼以下:

[WebMethod(Description = "JsonProblemPaper2")]
      [ScriptMethod(ResponseFormat = ResponseFormat.Json)]
      public string JsonProblemPaper2(String prkid)
      {
          return new JavaScriptSerializer().Serialize(dbOperation.ProblemPaper(prkid));
      }
View Code

DBOperation.cs代碼以下:

public List<string> JsonProblemPaper(String prkid)
    {


        List<String> list = new List<String>();

       



        try
        {
            string sql = "select PPID,PRKID,PTID,Name,ProblemNum,Row_Number() over(order by PPID ) as row_number from ProblemPaper where 1=1";
            sql += "  and prkid in ( select * from getProblemResourseByID(" + prkid + "))";
            string s = ConfigurationManager.ConnectionStrings["ConnectionString"].ConnectionString;
            SqlConnection con = new SqlConnection(s);
            con.Open();
            SqlCommand cmd = new SqlCommand(sql, con);
            SqlDataReader reader = cmd.ExecuteReader();


            while (reader.Read())
            {


                list.Add(reader[0].ToString());
                list.Add(reader[1].ToString());
                list.Add(reader[2].ToString()) ;
                list.Add(reader[3].ToString());
                list.Add(reader[4].ToString());

              
            }



            reader.Close();
            cmd.Dispose();

        }
        catch (Exception)
        {

        }


        return list;

    }
View Code

 

返回Json格式,須要在方法前面同時聲明

[WebMethod(Description = "××××")]
[ScriptMethod(ResponseFormat = ResponseFormat.Json)]

返回格式: return new JavaScriptSerializer().Serialize(dbOperation.ProblemPaper(prkid));

接下來的方法編寫由本身擴展,編寫完WebService

 3.部署

環境windows Server2008 IIS 7.5  SqlServer2012

選擇應用程序池.Net v.2.0,切記,如在部署遇到問題能夠查閱其餘相關資料,在這裏

就很少詳細

 4.IOS基於wsdl2objc調用asp.net WebService

4.1使用wsdl2objc工具

 在官網上下載有2個版本,我用的是WSDL2ObjC-0.6.zip,

部署完畢後,打開wsdl2objc

Parse WSDL後稍等15秒左右出現Finish!查看導入目錄

將生成的全部文件放置在wsdl2objc文件夾

嘗試編譯出現錯誤以下:

解決方法:這裏有2個錯誤

1."libxml/tree.h" file not found

2.ARC開啓與禁止

第一個錯誤解決方法以下:

支持libxml2

TARGETS -> Build Settings -> Linking -> Other Linker Flags,設置「-lxml2」

TARGETS -> Build Settings -> Search Paths-> Header Search Paths,設置「/usr/include/libxml2」

 

TARGETS -> Build Settings -> Apple LLVM5.0-Language-Objective C> Objective-C Automatic Reference Counting,設置「No」

 第二個錯誤解決方法:

TARGETS -> Build Settings ->All 搜索"compiler"

Apple LLVM 5.0- Custom CompilerFlags OtherWaning Flags 設置"-Wall"

 

打開Xcode的自動轉換工具

錯誤解決後,項目就能夠完整的運行了,在第一個錯誤當中我花的時間有些多,

若是你在作的過程中遇到這個錯誤

請從新嘗試再作看上面二個錯誤的解決方法,在第二個錯誤記得一次性轉換ARC

在項目當中還會用到手動設置ARC

手動ARC設置方法以下:

1.在Compiler Flags一列加上-fno-objc-arc就表示禁止這個.m文件的ARC

2.在Compiler Flags一列加上-fobjc-arc就表示開啓這個.m文件的ARC

 

參考資料:http://blog.csdn.net/a283127993/article/details/11082179

            http://blog.csdn.net/q199109106q/article/details/8565403

 

 

5. IOS客戶端解析xml,json數據

接下來詳細說明如何解析xml,json,每每遇到問題我就花了就是整整一天時間來作

5.1 IOS客戶端解析xml無參數據

代碼以下:

 

-(void)getXml{
  NSMutableArray *result;
ServiceSoap12Bingding *binding =[Service ServiceSoap];
Service_Course *request = [[Service_Course alloc] init];

ServiceSoap12BindingResponse *response = [binding CourseUsingParameters:request];
for(id mine in response.bodyParts){
    if([mine isKindOfClass:[Service_CourseResponse class]])
{
    [request  release];
    result = [mine CourseResult].CourseEntity;

}
for(Service_CourseEntity *t in result){

    NSLog(@"ID:%d ParentID:%d CourseName:%@ CoursePPT:%@ CourseVidio:%@",[t.CourseID intvalue],
[t.ParentID intvalue],t.CourseName,t.CoursePPT,t.CourseVidio
);
}



}         


}
View Code

5.2 IOS客戶端解析xml有參數數據

-(void)getXml2{
  NSMutableArray *result;
ServiceSoap12Bingding *binding =[Service ServiceSoap];
Service_ProblemPaper *request = [[Service_ProblemPaper alloc] init];
request.prkid=@"1";

ServiceSoap12BindingResponse *response = [binding ProblemPaperUsingParameters:request];
for(id mine in response.bodyParts){
    if([mine isKindOfClass:[Service_ProblemPaperResponse class]])
{
    [request  release];
    result = [mine ProblemPaperResult].ProblemPaperEntity;

}
for(Service_CourseEntity *t in result){

    NSLog(@"PPID:%d],
[t.PPID intvalue]);
}



}  
View Code

 

代碼以下:

5.3 IOS客戶端解析json有參數據

代碼以下:

 

-(void)getJson{
  NSMutableArray *result;
 NSData*data;
ServiceSoap12Bingding *binding =[Service ServiceSoap];
Service_JsonProblemPaper2 *request = [[Service_JsonProblemPaper2 alloc] init];
request.prkid=@"1";

ServiceSoap12BindingResponse *response = [binding JsonProblemPaper2UsingParameters:request];
for(id mine in response.bodyParts){
    if([mine isKindOfClass:[Service_JsonProblemPaper2Response class]])
{
    [request  release];
    result = [mine JsonProblemPaper2Result] ;
    data= [result dataUsingEncoding:NSUTF8StringEncoding];

    NSLog(@"data:%@",data);  
   NSDictionary *dict =[NSjSONSerialization JSONbjectWithData:data  options:NSJSONReadingAllowFragmentS error:nil];
if(dict == nil)
{
  return ;
}
else{
     for(NSString *ds in dict)
     {
        NSLog(@"json%@",[ds objectForKey:@"Name"]);
    }
}
}




} 
View Code

 

在這裏我只對解析json有參數聽說明,在這裏我遇到很多問題,花的時間挺多的,

IOS客戶端解析xml有參數數據,IOS客戶端解析xml有參數數據

參考代碼就能夠實現,在解析json有參數據,遇到了幾個問題,

就幾行代碼也花了很久,斷斷續續抽出時間作,最後才完成,下面是如何將NSString

最後完整的放入NSDictionary,而且取出相應的鍵值,result是返回類型的數據

將NSString轉化爲NSData

[result dataUsingEncoding:NSUTF8StringEncoding];

將result類型的數據,轉成UTF8的數據

首先咱們將result類型的數據,轉成UTF8的數據

 

將JSON串轉化爲字典

蘋果引入了一個解析JSON串的NSJSONSerialization類。
經過該類,咱們能夠完成JSON數據與NSDictionary和NSArray之間的轉化

開始的時候想將返回的NSString數據轉化爲NSDictionary即NSString-NSDictionary返回的數據爲null

因此採用NSString-NSData-NSDictionary最後成功解決數據爲null問題,數據成功拿到Name屬性值和其餘屬性值

在這裏我只打印Name屬性值

6.總結

  該博文面向初學者,大牛請不要噴。寫到這裏,又複習了好多知識,遇到以前沒發現的錯誤,可是耐心下來,問題總會解決,

 WebService和客戶端源碼有須要的話能夠留下郵箱,既然來了,對你有幫助,推薦支持一下唄!

http://www.cnblogs.com/linmingjun/p/4382565.html 做者

相關文章
相關標籤/搜索