387387 if  ( theRequest  ==  null )  { 
388388 theRequest  =  { } ; 
389389 } 
390-  theRequest [ part . substring ( 0 ,  ind ) ]  =  decodeURIComponent ( part . substring ( ind + 1 ) ) ; 
390+ 
391+  var  v  =  decodeURIComponent ( part . substring ( ind + 1 ) ) ; 
392+  try  { 
393+  v  =  JSON . parse ( v ) 
394+  } 
395+  catch  ( e )  { } 
396+ 
397+  theRequest [ part . substring ( 0 ,  ind ) ]  =  v ; 
391398 } 
392399
393400 return  theRequest ; 
623630 isRegister : false , 
624631 isCrossEnabled : false , 
625632 isMLEnabled : false , 
626-  isDelegateEnabled : false , 
633+  isDelegateEnabled : true , 
627634 isPreviewEnabled : false , 
628635 isEncodeEnabled : true , 
629636 isEditResponse : false , 
653660 host : '' , 
654661 database : 'MYSQL' ,  // 查文档必须,除非后端提供默认配置接口 // 用后端默认的,避免用户总是没有配置就问为什么没有生成文档和注释 'MYSQL',// 'POSTGRESQL', 
655662 schema : 'sys' ,  // 查文档必须,除非后端提供默认配置接口 // 用后端默认的,避免用户总是没有配置就问为什么没有生成文档和注释 'sys', 
656-  server : 'http://localhost:8080' ,  // Chrome 90+ 跨域问题非常难搞,开发模式启动都不行了 'http://apijson.org:9090', //apijson.cn 
663+  server : 'http://localhost:8080' ,  // 'http://apijson.cn:9090', //  Chrome 90+ 跨域问题非常难搞,开发模式启动都不行了 'http://apijson.org:9090', //apijson.cn 
657664 // server: 'http://47.74.39.68:9090', // apijson.org 
658665 thirdParty : 'SWAGGER /v2/api-docs' ,  //apijson.cn 
659666 // thirdParty: 'RAP /repository/joined /repository/get', 
34723479 var  url  =  StringUtil . get ( vUrl . value ) 
34733480 var  index  =  url . indexOf ( '?' ) 
34743481 if  ( index  >=  0 )  { 
3475-  var  params  =  StringUtil . split ( url . substring ( index  +  1 ) ,  '&' ) 
3476- 
3477-  var  paramObj  =  { } 
3478-  var  p 
3479-  var  v 
3480-  var  ind 
3481-  if  ( params  !=  null )  { 
3482-  for  ( var  i  =  0 ;  i  <  params . length ;  i ++ )  { 
3483-  p  =  params [ i ] 
3484-  ind  =  p  ==  null  ? - 1  : p . indexOf ( '=' ) 
3485-  if  ( ind  <  0 )  { 
3486-  continue 
3487-  } 
3488- 
3489-  v  =  p . substring ( ind  +  1 ) 
3490-  try  { 
3491-  v  =  JSON . parse ( v ) 
3482+  var  paramObj  =  getRequestFromURL ( url . substring ( index ) ) 
3483+  vUrl . value  =  url . substring ( 0 ,  index ) 
3484+  if  ( paramObj  !=  null  &&  $ . isEmptyObject ( paramObj )  ==  false )  { 
3485+  var  originVal  =  this . getRequest ( vInput . value ,  { } ) ; 
3486+  var  isConflict  =  false ; 
3487+ 
3488+  if  ( $ . isEmptyObject ( originVal )  ==  false )  { 
3489+  for  ( var  k  in  paramObj )  { 
3490+  if  ( originVal . hasOwnProperty ( k ) )  { 
3491+  isConflict  =  true ; 
3492+  break ; 
3493+  } 
34923494 } 
3493-  catch  ( e )  { } 
3494- 
3495-  paramObj [ p . substring ( 0 ,  ind ) ]  =  v 
34963495 } 
3497-  } 
34983496
3499-  vUrl . value  =  url . substring ( 0 ,  index ) 
3500-  if  ( $ . isEmptyObject ( paramObj )  ==  false )  { 
3501-  vInput . value  =  '// TODO 从 URL 上的参数转换过来:\n'  +  JSON . stringify ( paramObj ,  null ,  ' ' )  +  '\n// FIXME 需要与下面原来的字段合并为一个 JSON:\n'  +  StringUtil . get ( vInput . value ) 
3497+  if  ( isConflict )  { 
3498+  vInput . value  =  JSON . stringify ( paramObj ,  null ,  ' ' )  +  '\n\n// FIXME 从 URL 上的参数转换过来,需要与下面原来的字段合并为一个 JSON:\n\n'  +  StringUtil . get ( vInput . value ) 
3499+  } 
3500+  else  { 
3501+  vInput . value  =  JSON . stringify ( Object . assign ( originVal ,  paramObj ) ,  null ,  ' ' ) 
3502+  } 
35023503 } 
35033504 clearTimeout ( handler )  //解决 vUrl.value 和 vInput.value 变化导致刷新,而且会把 vInput.value 重置,加上下面 onChange 再刷新就卡死了 
35043505 } 
@@ -3798,86 +3799,106 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
37983799 var  selectionStart  =  target . selectionStart ; 
37993800 var  selectionEnd  =  target . selectionEnd ; 
38003801
3801-  if  ( ( selectionStart  <=  0  &&  selectionEnd  >=  StringUtil . get ( target . value ) . length )  ||  StringUtil . isEmpty ( target . value ,  true ) )  { 
3802-  if  ( target  ==  vUrl )  {  //TODO 把 Chrome 或 Charles 等抓到的 Header 和 Content 自动粘贴到 vUrl, vHeader 
3802+  if  ( StringUtil . isNotEmpty ( paste ,  true )  &&  ( StringUtil . isEmpty ( target . value ,  true ) 
3803+  ||  selectionStart  <=  0  &&  selectionEnd  >=  StringUtil . get ( target . value ) . length ) )  { 
3804+  if  ( target  ==  vUrl )  {  // TODO 把 Chrome 或 Charles 等抓到的 Response Header 和 Content 自动粘贴到 vUrl, vHeader 
38033805 try  { 
3804-  var  contentStart  =  0 ; 
3805-  var  lines  =  StringUtil . split ( paste ,  '\n' ) ; 
3806-  var  header  =  '' ; 
3807- 
3808-  for  ( var  i  =  0 ;  i  <  lines . length ;  i  ++ )  { 
3809-  var  l  =  StringUtil . trim ( lines [ i ] ) ; 
3810-  ind  =  l . indexOf ( ':' ) ; 
3811-  var  left  =  ind  <  0  ? ''  : StringUtil . trim ( l . substring ( 0 ,  ind ) ) ; 
3812- 
3813-  if  ( / ^ [ a - z A - Z 0 - 9 \-   ] + $ / g. test ( left ) )  { 
3814-  var  lowerKey  =  left . toLowerCase ( ) ; 
3815-  var  value  =  l . substring ( ind  +  1 ) ; 
3816- 
3817-  if  ( lowerKey  ==  'request method' )  { 
3818-  value  =  StringUtil . trim ( value ) . toUpperCase ( ) ; 
3819-  this . type  =  value  ==  'GET'  ? 'PARAM'  : ( value  ==  'POST'  ? 'JSON'  : value ) ; 
3820-  event . preventDefault ( ) ; 
3821-  } 
3822-  else  if  ( lowerKey  ==  'content-type' )  { 
3823-  var  type  =  vType . value  !=  'JSON'  ? null  : CONTENT_VALUE_TYPE_MAP [ StringUtil . trim ( value ) ] ; 
3824-  if  ( StringUtil . isEmpty ( type ,  true )  !=  true )  { 
3825-  this . type  =  type ; 
3806+  if  ( paste . trim ( ) . indexOf ( '\n' )  >  0 )  {  // 解决正常的 URL 都粘贴不了 
3807+  var  contentStart  =  0 ; 
3808+  var  lines  =  StringUtil . split ( paste ,  '\n' ) ; 
3809+  var  header  =  '' ; 
3810+ 
3811+  for  ( var  i  =  0 ;  i  <  lines . length ;  i ++ )  { 
3812+  var  l  =  StringUtil . trim ( lines [ i ] ) ; 
3813+  var  ind  =  l . indexOf ( ':' ) ; 
3814+  var  left  =  ind  <  0  ? ''  : StringUtil . trim ( l . substring ( 0 ,  ind ) ) ; 
3815+ 
3816+  if  ( / ^ [ a - z A - Z 0 - 9 \-   ] + $ / g. test ( left ) )  { 
3817+  var  lowerKey  =  left . toLowerCase ( ) ; 
3818+  var  value  =  l . substring ( ind  +  1 ) . trim ( ) ; 
3819+ 
3820+  if  ( lowerKey  ==  'host' )  { 
3821+  this . setBaseUrl ( value . endsWith ( ':443' )  ? 'https://'  +  value . substring ( 0 ,  value . length  -  ':443' . length )  : 'http://'  +  value ) ; 
38263822 event . preventDefault ( ) ; 
38273823 } 
3828-  } 
3829-  else  if  ( lowerKey  ==  'request url' )  { 
3830-  vUrl . value  =  StringUtil . trim ( value ) ; 
3831-  event . preventDefault ( ) ; 
3832-  } 
3833-  else  if  ( StringUtil . isEmpty ( lowerKey ,  true )  ||  lowerKey . startsWith ( 'accept-' ) 
3834-  ||  lowerKey . startsWith ( 'access-control-' )  ||  IGNORE_HEADERS . indexOf ( lowerKey )  >=  0 )  { 
3835-  // 忽略 
3836-  } 
3837-  else  { 
3838-  header  +=  '\n'  +  left  +  ': '  +  StringUtil . trim ( l . substring ( ind  +  1 ) ) ; 
3839-  } 
3840-  
3841-  contentStart  +=  lines [ i ] . length  +  1 ; 
3842-  } 
3843-  else  { 
3844-  if  ( l . startsWith ( 'HTTP/' )  ||  l . startsWith ( 'HTTPS/' ) )  {  // HTTP/1.1 200 
3845-  contentStart  +=  lines [ i ] . length  +  1 ; 
3846-  continue ; 
3847-  } 
3824+  else  if  ( lowerKey  ==  'request method' )  { 
3825+  value  =  value . toUpperCase ( ) ; 
3826+  this . type  =  value  ==  'GET'  ? 'PARAM'  : ( value  ==  'POST'  ? 'JSON'  : value ) ; 
3827+  event . preventDefault ( ) ; 
3828+  } 
3829+  else  if  ( lowerKey  ==  'content-type' )  { 
3830+  var  type  =  vType . value  !=  'JSON'  ? null  : CONTENT_VALUE_TYPE_MAP [ value ] ; 
3831+  if  ( StringUtil . isEmpty ( type ,  true )  !=  true )  { 
3832+  this . type  =  type ; 
3833+  event . preventDefault ( ) ; 
3834+  } 
3835+  } 
3836+  else  if  ( lowerKey  ==  'request url' )  { 
3837+  vUrl . value  =  value ; 
3838+  event . preventDefault ( ) ; 
3839+  } 
3840+  else  if  ( StringUtil . isEmpty ( lowerKey ,  true )  ||  lowerKey . startsWith ( 'accept-' ) 
3841+  ||  lowerKey . startsWith ( 'access-control-' )  ||  IGNORE_HEADERS . indexOf ( lowerKey )  >=  0 )  { 
3842+  // 忽略 
3843+  } 
3844+  else  { 
3845+  header  +=  '\n'  +  left  +  ': '  +  StringUtil . trim ( l . substring ( ind  +  1 ) ) ; 
3846+  } 
38483847
3849-  var  ind  =  l . indexOf ( ' ' ) ; 
3850-  var  m  =  ind  <  0  ? ''  : StringUtil . trim ( l . substring ( 0 ,  ind ) ) ; 
3851-  if  ( APIJSON_METHODS . indexOf ( m . toLowerCase ( ) )  >=  0 )  {  // POST /gets HTTP/1.1 
38523848 contentStart  +=  lines [ i ] . length  +  1 ; 
3853-  continue ; 
38543849 } 
3850+  else  { 
3851+  if  ( ind  <=  0  ||  StringUtil . isEmpty ( l )  ||  l . startsWith ( 'HTTP/' )  ||  l . startsWith ( 'HTTPS/' ) )  {  // HTTP/1.1 200 
3852+  contentStart  +=  lines [ i ] . length  +  1 ; 
3853+  continue ; 
3854+  } 
38553855
3856-  var  content  =  StringUtil . trim ( paste . substring ( contentStart ) ) ; 
3857-  var  json  =  null ; 
3858-  try  { 
3859-  json  =  JSON5 . parse ( content ) ;  // { "a":1, "b": "c" } 
3860-  }  catch  ( e )  { 
3861-  log ( e ) 
3856+  var  ind  =  l . indexOf ( ' ' ) ; 
3857+  var  m  =  ind  <  0  ? ''  : StringUtil . trim ( l . substring ( 0 ,  ind ) ) ; 
3858+  if  ( APIJSON_METHODS . indexOf ( m . toLowerCase ( ) )  >=  0 )  {  // POST /gets HTTP/1.1 
3859+  contentStart  +=  lines [ i ] . length  +  1 ; 
3860+  var  t  =  m . toUpperCase ( ) 
3861+  this . type  =  t  ==  'GET'  ? 'PARAM'  : ( t  ==  'POST'  ? 'JSON'  : t ) ; 
3862+ 
3863+  l  =  l . substring ( ind ) . trim ( ) ; 
3864+  ind  =  l . indexOf ( ' ' ) ; 
3865+  var  url  =  ind  <  0  ? l  : l . substring ( 0 ,  ind ) ; 
3866+  if  ( url . length  >  0  &&  url  !=  '/' )  { 
3867+  vUrl . value  =  this . getBaseUrl ( )  +  ( url . startsWith ( '/' )  ? url  : '/'  +  url ) ; 
3868+  } 
3869+ 
3870+  event . preventDefault ( ) ; 
3871+  continue ; 
3872+  } 
3873+ 
3874+  var  content  =  StringUtil . trim ( paste . substring ( contentStart ) ) ; 
3875+  var  json  =  null ; 
38623876 try  { 
3863-  json  =  getRequestFromURL ( content ) ;  // a=1&b=c 
3864-  }  catch  ( e2 )  { 
3865-  log ( e2 ) 
3877+  json  =  JSON5 . parse ( content ) ;  // { "a":1, "b": "c" } 
38663878 } 
3879+  catch  ( e )  { 
3880+  log ( e ) 
3881+  try  { 
3882+  json  =  getRequestFromURL ( '?'  +  content ) ;  // a=1&b=c 
3883+  }  catch  ( e2 )  { 
3884+  log ( e2 ) 
3885+  } 
3886+  } 
3887+ 
3888+  vInput . value  =  json  ==  null  ||  Object . keys ( json ) . length  <  0  ? ''  : JSON . stringify ( json ,  null ,  ' ' ) ; 
3889+  event . preventDefault ( ) ; 
3890+  break ; 
38673891 } 
38683892
3869-  vInput . value  =  json  ==  null  ||  Object . keys ( json ) . length  <  0  ? ''  : JSON . stringify ( json ,  null ,  ' ' ) ; 
3870-  event . preventDefault ( ) ; 
3871-  break ; 
38723893 } 
38733894
3895+  if  ( StringUtil . isEmpty ( header ,  true )  !=  true )  { 
3896+  vHeader . value  =  StringUtil . trim ( header ) ; 
3897+  event . preventDefault ( ) ; 
3898+  } 
38743899 } 
3875- 
3876-  if  ( StringUtil . isEmpty ( header ,  true )  !=  true )  { 
3877-  vHeader . value  =  StringUtil . trim ( header ) ; 
3878-  event . preventDefault ( ) ; 
3879-  } 
3880-  }  catch  ( e )  { 
3900+  } 
3901+  catch  ( e )  { 
38813902 log ( e ) 
38823903 } 
38833904 } 
@@ -3894,36 +3915,58 @@ Content-Type: ` + contentType) + (StringUtil.isEmpty(headerStr, true) ? '' : hea
38943915 } 
38953916 target . value  =  StringUtil . trim ( newStr ) ; 
38963917 event . preventDefault ( ) ; 
3897-  }  catch  ( e )  { 
3918+  } 
3919+  catch  ( e )  { 
38983920 log ( e ) 
38993921 } 
39003922 } 
39013923 else  if  ( target  ==  vInput )  {  // key: value 转 { "key": value } 
39023924 try  { 
3903-  var  lines  =  StringUtil . split ( paste ,  '\n' ) ; 
3904-  var  json  =  { } ; 
3925+  try  { 
3926+  JSON5 . parse ( paste ) ;  // 正常的 JSON 就不用转了 
3927+  } 
3928+  catch  ( e )  { 
3929+  var  lines  =  StringUtil . split ( paste ,  '\n' ) ; 
3930+  var  json  =  { } ; 
39053931
3906-  for  ( var  i  =  0 ;  i  <  lines . length ;  i   ++ )  { 
3907-  var  l  =  StringUtil . trim ( lines [ i ] )  ||  '' ; 
3908-  if  ( l . startsWith ( '//' ) )  { 
3909-  continue ; 
3910-  } 
3932+    for  ( var  i  =  0 ;  i  <  lines . length ;  i ++ )  { 
3933+    var  l  =  StringUtil . trim ( lines [ i ] )  ||  '' ; 
3934+    if  ( l . startsWith ( '//' ) )  { 
3935+    continue ; 
3936+    } 
39113937
3912-  var  ind  =  l . lastIndexOf ( ' //' ) ; 
3913-  l  =  ind  <  0  ? l  : StringUtil . trim ( l . substring ( 0 ,  ind ) ) ; 
3938+    var  ind  =  l . lastIndexOf ( ' //' ) ; 
3939+    l  =  ind  <  0  ? l  : StringUtil . trim ( l . substring ( 0 ,  ind ) ) ; 
39143940
3915-  ind  =  l . indexOf ( ':' ) ; 
3916-  if  ( ind  >=  0 )  { 
3917-  var  left  =  target  ==  vHeader  ? StringUtil . trim ( l . substring ( 0 ,  ind ) )  : l . substring ( 0 ,  ind ) ; 
3918-  json [ left ]  =  StringUtil . trim ( l . substring ( ind  +  1 ) ) ; 
3941+  ind  =  l . indexOf ( ':' ) ; 
3942+  if  ( ind  >=  0 )  { 
3943+  var  left  =  target  ==  vHeader  ? StringUtil . trim ( l . substring ( 0 ,  ind ) )  : l . substring ( 0 ,  ind ) ; 
3944+  if  ( left . indexOf ( '=' )  >=  0  ||  left . indexOf ( '&' )  >=  0 )  { 
3945+  try  { 
3946+  json  =  getRequestFromURL ( '?'  +  paste ) ; 
3947+  if  ( Object . keys ( json ) . length  >  0 )  { 
3948+  break ; 
3949+  } 
3950+  }  catch  ( e2 )  { 
3951+  log ( e ) 
3952+  } 
3953+  } 
3954+ 
3955+  json [ left ]  =  StringUtil . trim ( l . substring ( ind  +  1 ) ) ; 
3956+  } 
39193957 } 
3920-  } 
39213958
3922-  if  ( Object . keys ( json ) . length  >  0 )  { 
3923-  vInput . value  =  JSON . stringify ( json ,  null ,  ' ' ) ; 
3924-  event . preventDefault ( ) ; 
3959+  if  ( Object . keys ( json ) . length  <=  0 )  { 
3960+  json  =  getRequestFromURL ( '?'  +  paste ) ; 
3961+  } 
3962+ 
3963+  if  ( Object . keys ( json ) . length  >  0 )  { 
3964+  vInput . value  =  JSON . stringify ( json ,  null ,  ' ' ) ; 
3965+  event . preventDefault ( ) ; 
3966+  } 
39253967 } 
3926-  }  catch  ( e )  { 
3968+  } 
3969+  catch  ( e )  { 
39273970 log ( e ) 
39283971 } 
39293972 } 
0 commit comments