如何让 ruby 中的 RestClient 正确格式化带有特殊字符的响应?
How do I get RestClient in ruby to properly format responses with special characters?
我有一组对象要发送到 REST API 以接收有关这些对象的信息。为此,我使用带有以下行的 RestClient 来发送调用和解析响应。
response_raw = RestClient.get "http://#{re_host}:#{re_port}/reachengine/api/inventory/search?rql=fCSAssetNumber=#{fcs_id_num}%20size%20#{size}%20&apiKey=#{api_key}", headers
response_json = Crack::JSON.parse(response_raw)
response_json['results'].each do |result|
对于我执行此操作的前 20 多条记录,一切正常。然后我开始得到一个 NoMethodError: undefined method `[]' for nil:NilClass
当我运行代码在IRB中一步步执行的时候,看到的结果很奇怪
result = response_json['results'][0]
>=> {"name"=>"Publicaciòn_Listin_Diario.png", " id"=>" 294290", " dateCreated"=>" 2015-09-20T20:35:06.000+0000", " dateUpdated"=>" 2015-12-23T19:33:13.000+0000", " systemKeywords"=>" Publicaciòn_Listin_Diario.png Image ", "t humbnailId"=>"4 24725", "m etadata"=>{" sourceFilePath"=>"/ Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Publicaciòn_Listin_Diario.png", "pa MdCustAgency_picklist_sortable"=>"nul l", "th umbnailAssetFlag"=>"fal se", "re storeKey"=>"nul l", "ar chiveStatus_picklist_sortable"=>"nul l", "fC SAssetNumber"=>"18 2725", "fC SMetadataSet"=>"Ra w Graphic", "cu stKeywords"=>"Do minican Republic Cycling Team, 1307001 August 2013 KOS Kickoff show", "cu stAssetStatus_picklist_sortable"=>"nul l", "se archableFlag"=>"fal se", "as setType"=>"Im age", "pa MdCustHerbalifeJobNumber"=>"13 07001", "da teCreated"=>"20 15-09-20T20:35:06", "da teLocked"=>"nul l", "uu id"=>"30 9d9bb3-6935-4ab6-a04a-ef7264132bc6", "ve rsionFlag"=>"nul l", "ag ency_picklist_sortable"=>"nul l", "pr oducer_picklist_sortable"=>"nul l", "tr uncatedFlag"=>"fal se", "cu stDescription"=>"*R aw Graphics for 1307001_August_2013_KOS"}, "in ventoryKey"=>"im age"}
通常,有了这个回复,我可以运行
结果['metadata']['fCSAssetNumber']
但是;由于随机空格,这失败了 "NoMethodError: undefined method `[]' for nil:NilClass" 因为字符串不是 'metadata' 它实际上是 'm etadata'
所有这一切真的很奇怪,为什么这是一个 Ruby 问题而不是轻易确定是 API 的问题是通过 Postman REST Client 在chrome returns 这个结果:
>{
"results": [
{
"name": "Publicaciòn_Listin_Diario.png",
"id": "294290",
"dateCreated": "2015-09-20T20:35:06.000+0000",
"dateUpdated": "2015-12-23T19:33:13.000+0000",
"systemKeywords": "Publicaciòn_Listin_Diario.png Image ",
"thumbnailId": "424725",
"metadata": {
"sourceFilePath": "/Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Publicaciòn_Listin_Diario.png",
"paMdCustAgency_picklist_sortable": null,
"thumbnailAssetFlag": false,
"restoreKey": null,
"archiveStatus_picklist_sortable": null,
"fCSAssetNumber": "182725",
"fCSMetadataSet": "Raw Graphic",
"custKeywords": "Dominican Republic Cycling Team, 1307001 August 2013 KOS Kickoff show",
"custAssetStatus_picklist_sortable": null,
"searchableFlag": false,
"assetType": "Image",
"paMdCustHerbalifeJobNumber": "1307001",
"dateCreated": "2015-09-20T20:35:06",
"dateLocked": null,
"uuid": "309d9bb3-6935-4ab6-a04a-ef7264132bc6",
"versionFlag": null,
"agency_picklist_sortable": null,
"producer_picklist_sortable": null,
"truncatedFlag": false,
"custDescription": "*Raw Graphics for 1307001_August_2013_KOS"
},
"inventoryKey": "image"
}
],
"total": "1"
}
广告您可以在上面看到,当 Postman 运行 发出完全相同的呼叫时,响应没有问题,但是当 ruby 运行 发出呼叫时,响应就会出现问题。另请注意,这不会一直发生。
下面是来自同一 ruby 调用的实际响应示例。
result = response_json['results'][0]
=> {"name"=>"Marco_1er_dia.png", "id"=>"294284", "dateCreated"=>"2015-09-`20T20:34:54.000+0000", "dateUpdated"=>"2015-12-23T19:33:10.000+0000", "systemKeywords"=>"Marco_1er_dia.png Image ", "thumbnailId"=>"424716", "metadata"=>{"sourceFilePath"=>"/Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Marco_1er_dia.png", "paMdCustAgency_picklist_sortable"=>nil, "collectionMemberships"=>"320 321", "thumbnailAssetFlag"=>false, "restoreKey"=>nil, "fCSMetadataSet"=>"Raw Graphic", "fCSAssetNumber"=>"182722", "archiveStatus_picklist_sortable"=>nil, "custAssetStatus_picklist_sortable"=>nil, "custKeywords"=>"1307001 August 2013 KOS Kickoff show, Dominican Republic Cycling Team", "searchableFlag"=>false, "assetType"=>"Image", "paMdCustHerbalifeJobNumber"=>"1307001", "dateCreated"=>"2015-09-20T20:34:54", "dateLocked"=>nil, "uuid"=>"b5e55c14-b94e-4629-9e2a-61a2dc0876f6", "versionFlag"=>nil, "fCSProductionStatus_picklist_sortable"=>nil, "agency_picklist_sortable"=>nil, "producer_picklist_sortable"=>nil, "truncatedFlag"=>false, "custDescription"=>"*Raw Graphics for 1307001_August_2013_KOS"}, "inventoryKey"=>"image"}`
请注意上面的响应如何没有间距问题?我在这里看到的唯一明显区别是文件名中使用了一个特殊字符:ò
我需要做些什么才能让 RESTClient 处理这个问题吗?
有人知道如何解决这个问题吗?
此问题与 'crack' gem 有关。我已经用了很长时间了。显然,从 Ruby 1.9 开始,parse 方法已经在标准 JSON class 上可用。当我通过更改
切换到使用它时
response_json = Crack::JSON.parse(response_raw)
至
response_json = JSON.parse(response_raw)
问题已解决。
我有一组对象要发送到 REST API 以接收有关这些对象的信息。为此,我使用带有以下行的 RestClient 来发送调用和解析响应。
response_raw = RestClient.get "http://#{re_host}:#{re_port}/reachengine/api/inventory/search?rql=fCSAssetNumber=#{fcs_id_num}%20size%20#{size}%20&apiKey=#{api_key}", headers
response_json = Crack::JSON.parse(response_raw)
response_json['results'].each do |result|
对于我执行此操作的前 20 多条记录,一切正常。然后我开始得到一个 NoMethodError: undefined method `[]' for nil:NilClass
当我运行代码在IRB中一步步执行的时候,看到的结果很奇怪
result = response_json['results'][0]
>=> {"name"=>"Publicaciòn_Listin_Diario.png", " id"=>" 294290", " dateCreated"=>" 2015-09-20T20:35:06.000+0000", " dateUpdated"=>" 2015-12-23T19:33:13.000+0000", " systemKeywords"=>" Publicaciòn_Listin_Diario.png Image ", "t humbnailId"=>"4 24725", "m etadata"=>{" sourceFilePath"=>"/ Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Publicaciòn_Listin_Diario.png", "pa MdCustAgency_picklist_sortable"=>"nul l", "th umbnailAssetFlag"=>"fal se", "re storeKey"=>"nul l", "ar chiveStatus_picklist_sortable"=>"nul l", "fC SAssetNumber"=>"18 2725", "fC SMetadataSet"=>"Ra w Graphic", "cu stKeywords"=>"Do minican Republic Cycling Team, 1307001 August 2013 KOS Kickoff show", "cu stAssetStatus_picklist_sortable"=>"nul l", "se archableFlag"=>"fal se", "as setType"=>"Im age", "pa MdCustHerbalifeJobNumber"=>"13 07001", "da teCreated"=>"20 15-09-20T20:35:06", "da teLocked"=>"nul l", "uu id"=>"30 9d9bb3-6935-4ab6-a04a-ef7264132bc6", "ve rsionFlag"=>"nul l", "ag ency_picklist_sortable"=>"nul l", "pr oducer_picklist_sortable"=>"nul l", "tr uncatedFlag"=>"fal se", "cu stDescription"=>"*R aw Graphics for 1307001_August_2013_KOS"}, "in ventoryKey"=>"im age"}
通常,有了这个回复,我可以运行 结果['metadata']['fCSAssetNumber']
但是;由于随机空格,这失败了 "NoMethodError: undefined method `[]' for nil:NilClass" 因为字符串不是 'metadata' 它实际上是 'm etadata'
所有这一切真的很奇怪,为什么这是一个 Ruby 问题而不是轻易确定是 API 的问题是通过 Postman REST Client 在chrome returns 这个结果:
>{
"results": [
{
"name": "Publicaciòn_Listin_Diario.png",
"id": "294290",
"dateCreated": "2015-09-20T20:35:06.000+0000",
"dateUpdated": "2015-12-23T19:33:13.000+0000",
"systemKeywords": "Publicaciòn_Listin_Diario.png Image ",
"thumbnailId": "424725",
"metadata": {
"sourceFilePath": "/Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Publicaciòn_Listin_Diario.png",
"paMdCustAgency_picklist_sortable": null,
"thumbnailAssetFlag": false,
"restoreKey": null,
"archiveStatus_picklist_sortable": null,
"fCSAssetNumber": "182725",
"fCSMetadataSet": "Raw Graphic",
"custKeywords": "Dominican Republic Cycling Team, 1307001 August 2013 KOS Kickoff show",
"custAssetStatus_picklist_sortable": null,
"searchableFlag": false,
"assetType": "Image",
"paMdCustHerbalifeJobNumber": "1307001",
"dateCreated": "2015-09-20T20:35:06",
"dateLocked": null,
"uuid": "309d9bb3-6935-4ab6-a04a-ef7264132bc6",
"versionFlag": null,
"agency_picklist_sortable": null,
"producer_picklist_sortable": null,
"truncatedFlag": false,
"custDescription": "*Raw Graphics for 1307001_August_2013_KOS"
},
"inventoryKey": "image"
}
],
"total": "1"
}
广告您可以在上面看到,当 Postman 运行 发出完全相同的呼叫时,响应没有问题,但是当 ruby 运行 发出呼叫时,响应就会出现问题。另请注意,这不会一直发生。
下面是来自同一 ruby 调用的实际响应示例。
result = response_json['results'][0]
=> {"name"=>"Marco_1er_dia.png", "id"=>"294284", "dateCreated"=>"2015-09-`20T20:34:54.000+0000", "dateUpdated"=>"2015-12-23T19:33:10.000+0000", "systemKeywords"=>"Marco_1er_dia.png Image ", "thumbnailId"=>"424716", "metadata"=>{"sourceFilePath"=>"/Volumes/ONLINE_DAM/MEDIA/RAW_GRAPHICS/1307001_August_2013_KOS/Marco_1er_dia.png", "paMdCustAgency_picklist_sortable"=>nil, "collectionMemberships"=>"320 321", "thumbnailAssetFlag"=>false, "restoreKey"=>nil, "fCSMetadataSet"=>"Raw Graphic", "fCSAssetNumber"=>"182722", "archiveStatus_picklist_sortable"=>nil, "custAssetStatus_picklist_sortable"=>nil, "custKeywords"=>"1307001 August 2013 KOS Kickoff show, Dominican Republic Cycling Team", "searchableFlag"=>false, "assetType"=>"Image", "paMdCustHerbalifeJobNumber"=>"1307001", "dateCreated"=>"2015-09-20T20:34:54", "dateLocked"=>nil, "uuid"=>"b5e55c14-b94e-4629-9e2a-61a2dc0876f6", "versionFlag"=>nil, "fCSProductionStatus_picklist_sortable"=>nil, "agency_picklist_sortable"=>nil, "producer_picklist_sortable"=>nil, "truncatedFlag"=>false, "custDescription"=>"*Raw Graphics for 1307001_August_2013_KOS"}, "inventoryKey"=>"image"}`
请注意上面的响应如何没有间距问题?我在这里看到的唯一明显区别是文件名中使用了一个特殊字符:ò 我需要做些什么才能让 RESTClient 处理这个问题吗?
有人知道如何解决这个问题吗?
此问题与 'crack' gem 有关。我已经用了很长时间了。显然,从 Ruby 1.9 开始,parse 方法已经在标准 JSON class 上可用。当我通过更改
切换到使用它时response_json = Crack::JSON.parse(response_raw)
至
response_json = JSON.parse(response_raw)
问题已解决。